package com.demo.simple;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author wangning
 * @date 2023/11/17 20:45
 * 两数之和
 * 设定一个整数数组 nums 和一个整数目标值 target，请你在数组中找出和为目标值target的那两个整数，并返回他们的下标
 * 你可以假设每种输入只会对应一个答案，但是，数组中的同一个元素在答案里不能重复出现，，你可以按任意顺序返回答案。
 * 例如：
 * nums = [2, 7, 11, 15],target = 9
 * 输出 [0, 1]
 * 因为 nums[0] + num[1] == 9，返回 [0, 1]
 */
public class SumOfTwoNum {
    public static void main(String[] args) {
        int[] nums = {2, 7, 11, 15};
//        int[] nums2 = new int[]{2, 7, 11, 15};
//        int[] nums3 = new int[4];
        int target = 17;
//        int[] res = getIndex(nums, target);
        int[] res = getIndex2(nums, target);

        System.out.println("nums = " + Arrays.toString(nums));
        System.out.println("res = " + Arrays.toString(res));
    }

    /**
     * 
     * @param nums Array
     * @param target 目标值
     * @return []
     */
    private static int[] getIndex2(int[] nums, int target) {
        Map<Integer, Integer> ids = new HashMap<>();
        for (int i = 0; ; i++) {
            System.out.println("i = " + i);
            System.out.println("ids = " + ids);
            int x = nums[i];
            //从左边寻找 nums[i]，满足 nums[i] + x = target
            if (ids.containsKey(target - x)) {
                return new int[]{ids.get(target - x), i};
            }
            ids.put(x, i);
        }
    }


    /**
     * 暴力循环法
     *
     * @param nums Array
     * @param target 目标值
     * @return []
     */
    private static int[] getIndex(int[] nums, int target) {
        int[] res = new int[2];
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = nums.length - 1; j > i; j--) {
                if ((nums[i] + nums[j]) == target) {
                    res[0] = i;
                    res[1] = j;
                    break;
                }
            }
        }
        return res;
    }
}
